package com.imooc.SmartChargeStation.demo.mqtt.PahoMode.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.stereotype.Component;

/**
 * author: zpy
 * description: MQTT消息监听器类
 * date: 2025/8/16
 */

@Component
//让Spring在启动的时候自动创建对象，并加入IOC容器中，
//我用的时候，不手动创建实例（用 new 关键字），而是通过@Autowired 自动获取对象
//手动：MessageListener listener = new MessageListener();
//自动：@Autowired MessageListener listener;
@Slf4j
/**
 怎么理解这个？
 为什么需要这个MessageListener，callback不是已经实现了吗？
 举个例子理解：我的 MQTT 客户端订阅了 3 个主题：temp（温度数据）、current（电流数据）、alert（报警信息）
 1.callback写法：采用大量的if-else判断，判断主题，然后处理对应的业务逻辑

 if (topic.equals("temp")) {
 // 处理温度数据
 }else if (topic.equals("current")) {
 // 处理电流数据
 }
 else if (topic.equals("alert")) {
 // 处理报警信息
 }

 2.MessageListener写法：可以为每个主题单独写处理逻辑
 // 温度数据监听器
 public class TempListener implements IMqttMessageListener
 {
 @Override
 public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception
 {
 //处理温度数据逻辑
 }
 }
 // 报警数据监听器
 public class AlertListener implements IMqttMessageListener {
@Override
public void messageArrived(String topic, MqttMessage message) {
// 处理报警逻辑
}
}
 ......
 总结一下：a.MqttCallback：负责客户端的 “全局事件”，是客户端的 “大管家”。
 b.IMqttMessageListener：负责 “特定主题的消息处理”，是某个主题的 “专属处理员”。

 */
public class MessageListener implements IMqttMessageListener {
    /**
     * description: 接收到订阅的主题推送的消息
     * @param topic:
     * @param mqttMessage:
     * @return void
     * Understanding:不处理整体，只处理具体的。
     */
    @Override//编译器看到 @Override 后，会自动去检查父类或接口中是否真的有这个方法
    public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
        //解包，获取消息内容
        //将mqttMessage理解成一个智能信封，不仅包含你要发送的内容，还带有如何处理这个内容的指示（QoS、是否保留等）
        String message = new String(mqttMessage.getPayload());
        log.info(">>>>>监听器收到订阅主题的消息：topic={},message={}", topic, message);
    }
}
